package com.zjsru.plan2023.oneday;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @Author: cookLee
 * @Date: 2023-09-05
 * 从两个数字数组里生成最小数字
 * \
 * 输入：nums1 = [4,1,3], nums2 = [5,7]
 * 输出：15
 * 解释：数字 15 的数位 1 在 nums1 中出现，数位 5 在 nums2 中出现。15 是我们能得到的最小数字。
 * \
 * 输入：nums1 = [3,5,2,6], nums2 = [3,1,7]
 * 输出：3
 * 解释：数字 3 的数位 3 在两个数组中都出现了。
 */
public class MinNumber {

    /**
     * 方法一
     * @param nums1
     * @param nums2
     * @return int
     */
    public int minNumber(int[] nums1, int[] nums2) {
        int minNumber1 = this.helper(nums1);
        int minNumber2 = this.helper(nums2);
        int number = this.helper(nums1, nums2);
        if (number != Integer.MAX_VALUE) {
            return number;
        } else if (minNumber1 > minNumber2) {
            return Integer.parseInt(new StringBuilder().append(minNumber2).append(minNumber1).toString());
        } else {
            return Integer.parseInt(new StringBuilder().append(minNumber1).append(minNumber2).toString());
        }
    }

    /**
     * 判断最小数
     *
     * @param nums
     * @return int
     */
    private int helper(int[] nums) {
        int min = nums[0];
        for (int x = 1; x < nums.length; x++) {
            if (nums[x] < min) {
                min = nums[x];
            }
        }
        return min;
    }

    /**
     * 判断两个数组中是否有相等的最小值
     *
     * @param nums1
     * @param nums2
     * @return int
     */
    private int helper(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        int ans = Integer.MAX_VALUE;
        for (int num : nums1) {
            set.add(num);
        }
        for (int num : nums2) {
            if (set.contains(num)) {
                ans = Math.min(num, ans);
            }
        }
        return ans;
    }


    /**
     * 方法二:相对于方法一的优化
     *
     * @param nums1
     * @param nums2
     * @return int
     */
    public int minNumber2(int[] nums1, int[] nums2) {
        int num = this.sameHelper(nums1, nums2);
        if (num != -1) {
            return num;
        }
        int number1 = Arrays.stream(nums1).min().getAsInt();
        int number2 = Arrays.stream(nums2).min().getAsInt();
        return Math.min(number1 * 10 + number2, number2 * 10 + number1);
    }

    /**
     * 判断是否相同数字
     *
     * @param nums1
     * @param nums2
     * @return int
     */
    private int sameHelper(int[] nums1, int[] nums2) {
        Set<Integer> set = new HashSet<>();
        //数字只出现在1-9中
        int ans = 10;
        for (int num : nums1) {
            set.add(num);
        }
        for (int num : nums2) {
            if (set.contains(num)) {
                ans = Math.min(num, ans);
            }
        }
        return ans == 10 ? -1 : ans;
    }

    public static void main(String[] args) {
        MinNumber minNumber = new MinNumber();
        int[] nums1 = new int[]{4,1,3};
        int[] nums2= new int[]{5,7};
        System.out.println(minNumber.minNumber(nums1, nums2));
    }

}
